{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal_len</th>\n",
       "      <th>sepal_wid</th>\n",
       "      <th>petal_len</th>\n",
       "      <th>petal_wid</th>\n",
       "      <th>class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>4.9</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.7</td>\n",
       "      <td>3.2</td>\n",
       "      <td>1.3</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4.6</td>\n",
       "      <td>3.1</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5.0</td>\n",
       "      <td>3.6</td>\n",
       "      <td>1.4</td>\n",
       "      <td>0.2</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.9</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.4</td>\n",
       "      <td>Iris-setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   sepal_len  sepal_wid  petal_len  petal_wid        class\n",
       "0        4.9        3.0        1.4        0.2  Iris-setosa\n",
       "1        4.7        3.2        1.3        0.2  Iris-setosa\n",
       "2        4.6        3.1        1.5        0.2  Iris-setosa\n",
       "3        5.0        3.6        1.4        0.2  Iris-setosa\n",
       "4        5.4        3.9        1.7        0.4  Iris-setosa"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "# 读取数据集\n",
    "df = pd.read_csv(r'data_set\\iris.data')\n",
    "# 原始数据没有给定列名的时候需要我们自己加上\n",
    "df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把数据分成特征和标签\n",
    "\n",
    "X = df.iloc[:,0:4].values\n",
    "y = df.iloc[:,4].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "# 展示我们标签用的\n",
    "label_dict = {1: 'Iris-Setosa',\n",
    "              2: 'Iris-Versicolor',\n",
    "              3: 'Iris-Virgnica'}\n",
    "\n",
    "# 展示特征用的\n",
    "feature_dict = {0: 'sepal length [cm]',\n",
    "                1: 'sepal width [cm]',\n",
    "                2: 'petal length [cm]',\n",
    "                3: 'petal width [cm]'}\n",
    "\n",
    "# 指定绘图区域大小\n",
    "plt.figure(figsize=(8, 6))\n",
    "for cnt in range(4):\n",
    "    # 这里用子图来呈现4个特征\n",
    "    plt.subplot(2, 2, cnt+1)\n",
    "    for lab in ('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'):\n",
    "        plt.hist(X[y==lab, cnt],\n",
    "                     label=lab,\n",
    "                     bins=10,\n",
    "                     alpha=0.3,)\n",
    "    plt.xlabel(feature_dict[cnt])\n",
    "    plt.legend(loc='upper right', fancybox=True, fontsize=8)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一般情况都是先对数据进行标准化处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "X_std = StandardScaler().fit_transform(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算协方差矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2.38437160e-16,  2.38437160e-17, -9.53748639e-17, -1.43062296e-16])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean_vec = np.mean(X_std, axis=0)\n",
    "mean_vec"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "协方差矩阵 \n",
      "[[ 1.00675676 -0.10448539  0.87716999  0.82249094]\n",
      " [-0.10448539  1.00675676 -0.41802325 -0.35310295]\n",
      " [ 0.87716999 -0.41802325  1.00675676  0.96881642]\n",
      " [ 0.82249094 -0.35310295  0.96881642  1.00675676]]\n"
     ]
    }
   ],
   "source": [
    "cov_mat = (X_std - mean_vec).T.dot((X_std - mean_vec)) / (X_std.shape[0]-1)\n",
    "print('协方差矩阵 \\n%s' %cov_mat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NumPy 计算协方差矩阵: \n",
      "[[ 1.00675676 -0.10448539  0.87716999  0.82249094]\n",
      " [-0.10448539  1.00675676 -0.41802325 -0.35310295]\n",
      " [ 0.87716999 -0.41802325  1.00675676  0.96881642]\n",
      " [ 0.82249094 -0.35310295  0.96881642  1.00675676]]\n"
     ]
    }
   ],
   "source": [
    "print('NumPy 计算协方差矩阵: \\n%s' %np.cov(X_std.T))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算特征向量与特征值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "特征向量 \n",
      "[[ 0.52308496 -0.36956962 -0.72154279  0.26301409]\n",
      " [-0.25956935 -0.92681168  0.2411952  -0.12437342]\n",
      " [ 0.58184289 -0.01912775  0.13962963 -0.80099722]\n",
      " [ 0.56609604 -0.06381646  0.63380158  0.52321917]]\n",
      "\n",
      "特征值 \n",
      "[2.92442837 0.93215233 0.14946373 0.02098259]\n"
     ]
    }
   ],
   "source": [
    "cov_mat = np.cov(X_std.T)\n",
    "\n",
    "eig_vals, eig_vecs = np.linalg.eig(cov_mat)\n",
    "\n",
    "print('特征向量 \\n%s' %eig_vecs)\n",
    "print('\\n特征值 \\n%s' %eig_vals)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[(2.9244283691111126, array([ 0.52308496, -0.25956935,  0.58184289,  0.56609604])), (0.9321523302535072, array([-0.36956962, -0.92681168, -0.01912775, -0.06381646])), (0.14946373489813383, array([-0.72154279,  0.2411952 ,  0.13962963,  0.63380158])), (0.020982592764270565, array([ 0.26301409, -0.12437342, -0.80099722,  0.52321917]))]\n",
      "----------\n",
      "特征值又大到小排序结果:\n",
      "2.9244283691111126\n",
      "0.9321523302535072\n",
      "0.14946373489813383\n",
      "0.020982592764270565\n"
     ]
    }
   ],
   "source": [
    "# 把特征值和特征向量对应起来\n",
    "eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))]\n",
    "print (eig_pairs)\n",
    "print ('----------')\n",
    "# 把它们按照特征值大小进行排序\n",
    "eig_pairs.sort(key=lambda x: x[0], reverse=True)\n",
    "\n",
    "# 打印排序结果\n",
    "print('特征值又大到小排序结果:')\n",
    "for i in eig_pairs:\n",
    "    print(i[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "累加结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[72.62003332692029, 23.147406858644153, 3.711515564584534, 0.5210442498510144]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ 72.62003333,  95.76744019,  99.47895575, 100.        ])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算累加结果\n",
    "tot = sum(eig_vals)\n",
    "var_exp = [(i / tot)*100 for i in sorted(eig_vals, reverse=True)]\n",
    "print (var_exp)\n",
    "cum_var_exp = np.cumsum(var_exp)\n",
    "cum_var_exp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1 2 3 4]\n",
      "-----------\n",
      "[ 1  3  6 10]\n"
     ]
    }
   ],
   "source": [
    "a = np.array([1,2,3,4])\n",
    "print (a)\n",
    "print ('-----------')\n",
    "print (np.cumsum(a))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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dzB06FCefvppBg4cCMC0adNYsmRJYrtNmzbxzTffUL9+/cSyKVOmsHDhwkTNbuPGjSxfvpwWLVowevRo2rdvT5cuXRg8eHBin969e3PwwQcDcPbZZ/P222/vlKDcnd/85jfMnDmTrKwsPv30U9auXZtIcCU6d+5M8+bNAcjPz2fVqlU0atSIRYsW0bt3byCo4TVr1oyNGzfy9ddf06NHDwAuuugiXn111058Tj31VK655hq2bdvGa6+9xgknnEDdunXZuHFjynLt3Llz0ubdqa4DoEWLFuTn5wPQsWNHVq1axTfffMOnn37KWWedBQQJrqSMp0yZwjHHHAMENbPly5enL0EBPYA3gJ8nWecEPUuIyB4qr6aTLu6etFVV7dq12bFjR2Kb77//PrFu//33T0xnZWUl5rOysiguLq5w/xIjR47k0EMP5f3332fHjh2JH7nydO3alRUrVrBu3TpeeOEF/vM//xOAHTt28M4771C3bt1yr3X06NH07dt3l3WffvopWVlZrF27lh07dpCVFTz1KFs2ZeefeOIJ1q1bx9y5c6lTpw45OTlJX7ouXWa1atWiuLgYd6ddu3a88847O2379ddfR2rplp2dTc+ePfnb3/7GhAkTEom1vHI94IADkh6rvOsoG/uWLVsStyjLcnduueUWLr/88grj3x0pn0G5+wgzywJedfehZT6X7NUoRKRK9erVi2eeeYb169cDJG7x5eTkMHfuXAAmT57M9u3bd+u4UfbfuHEjzZo1Iysri8cffzzx4L5+/fp88803SY9rZpx11lnccMMNtGnTJlG76dOnD3/6058S2y1YsGCXffv27csDDzyQiGXZsmV8++23FBcXM3ToUJ588knatGnDvffem9hn6tSpbNiwgS1btvDCCy/QrVu3Xa7hkEMOoU6dOkyfPp1//vOfkcuoVatWrFu3LpGgtm/fzuLFi2nUqBENGzbk7bffBoLkkcqgQYN49NFHeeuttxKJN1W5lmd3r6NBgwY0b96cF154AYBt27bx3Xff0bdvXx555BE2b94MBIn/iy/2vK+FchtJhGNBDd/js4hIrLRr145bb72VHj16kJeXxw033ADAsGHDePPNN+ncuTOzZ89O+T/vVKLsf+WVVzJ+/Hi6dOnCsmXLEtvk5uZSu3Zt8vLyGDly5C77DRw4kL/85S+J23sAo0aNoqioiNzcXNq2bcuYMWN22e/SSy+lbdu2FBQU0L59ey6//HKKi4v57//+b44//niOP/547r33Xh566KHE86vu3btz0UUXkZ+fzznnnLPT7T2ACy64gKKiIgoLC3niiSdo3bp15DLab7/9mDhxIjfddBN5eXnk5+cnGjQ8+uijXHXVVXTt2rXcWmGfPn2YOXMmJ598Mvvtt1+55VqeylzH448/zqhRo8jNzeW4447j888/p0+fPpx//vl07dqVDh06MGDAgJT/2dgdlqrKltjA7LcETc0nAN+WLI/De0qFhYVe8hCwskZOrfj+d011fe+WmQ5hn7V06VLatGmT6TAkiXHjxlFUVLRTzUz2jmR/781srrsXJts+SldHJbfzriq1zAl6JRcREUmLKM3M9VKuiNQYQ4YMYciQIZkOQ4jeWWx7oC07dxb7WLqCEhERidJZ7AiCkW7bAq8ApwJvA0pQIiKSNlG6OhpAMCTG5+4+FMgD9i9/FxERkT0TqbPYsLl5sZk1IBhIUA0kREQkraIkqKKws9gHgbkEHcbu6XhQIpJhuzvkQknnrQAvvvgid999d7nb/+53v2PatGnlHqcycnJy+PLLLyu9f0XKdnibTKprq4yePXuyp6/LJLM3Y8yUKK34rgwnx5jZa0ADd1+Y3rBEapa9/T5elHfY9mTIhX79+iU6FU3ljjsqNeh2tRD3a/vhhx9iH2MUFdagzGyymZ1vZge4+yolJ5F9Q5RhIV577TVat25N9+7dee65H7vfHDduHMOHD2fjxo3k5OQk+t/77rvvOOKII9i+fftONZFUx7ntttu45557EvPt27dn1apVAJx55pl07NiRdu3aMXbs2AqvZ8qUKXTt2pWCggLOPfdcNm/ezMaNG2nVqhUfffQRAIMHD+bBBx9MXP+vf/1rCgoK6NWrV9LhyO+44w46depE+/btueyyyxLlUvracnJyGDFiRGLIig8//BCAb7/9lksuuYROnTpxzDHHJIay2LJlC4MGDSI3N5eBAwcmhrEo7dVXX+W8885LzM+YMYOf/zzoFvWKK66gsLCQdu3a7TSsRU5ODnfccQfdu3fn2Wef3SnGVNfRs2dPbrrpJjp37kzLli156623gCDB/fu//zsdOnQgNzeX0aNHA6mHCUmXKLf47gW6A0vM7FkzG2BmFffuKCLVxvz587nvvvtYsmQJH3/8MbNmzWLr1q0MGzaMl156ibfeeovPP/98l/0aNmxIXl4eb775JgAvvfQSffv2pU6dOoltohwnmUceeYS5c+dSVFTEqFGjEv0GJvPll19y5513Mm3aNObNm0dhYSH33nsvDRs25E9/+hNDhgzh6aef5quvvmLYsGFAkEAKCgqYN28ePXr0SDru0/Dhw3nvvfdYtGgRW7ZsSQwFUlaTJk2YN28eV1xxRSLh3nXXXZx00km89957TJ8+nRtvvJFvv/2WBx54gHr16rFw4UJuvfXWRN+FpfXu3Zt3332Xb78NOu+ZMGFCoounu+66i6KiIhYuXMibb77JwoU/1hmys7N5++23GTRoUOTrKC4uZs6cOdx3332JMhg7diwrV65k/vz5LFy4kAsuuIDt27dz9dVXM3HiRObOncsll1zCrbfemvLPZG+oMEG5+5vhbb6jgLHAeQQNJURkH1EyLERWVlZiWIgPP/yQFi1acPTRR2NmXHjhhUn3HThwIBMmTADYaSiMElGPU9aoUaPIy8ujS5cu/Otf/2L58uUpt3333XdZsmQJ3bp1Iz8/n/Hjxyc6Pu3duzcdOnTgqquu4qGHHkrsk5WVlYj1wgsvTHTSWtr06dM59thj6dChA2+88QaLFy9Oev6zzw5GJSoZlgKCGt3dd99Nfn4+PXv2ZOvWrXzyySfMnDkzUQa5ubnk5ubucrzatWtzyimn8NJLL1FcXMxf//pX+vfvD8AzzzxDQUEBxxxzDIsXL95puJGyZR/lOpLFPm3aNH71q19Ru3bwFKhx48Z89NFHiWFC8vPzufPOO1m9enXS8+0tUV/UrUsw7MZAoAAYn86gRKRqJRsWAnYdZiKZfv36ccstt7Bhwwbmzp3LSSedtMs2qY5TengOIDHUw4wZM5g2bRrvvPMO9erVS/zAp+Lu9O7dm6eeemqXdTt27GDp0qXUrVuXDRs2JMZnqijGrVu3cuWVV1JUVMQRRxzBbbfdljKGkvIrXXbuzqRJk2jVqlWF50pm4MCB3H///TRu3JhOnTpRv359Vq5cyT333MN7773HQQcdxJAhQ3aKKVkHsRVdR6rYy8aYapiQdIryDGoCsBQ4Cbgf+Km7X53uwEQks1q3bs3KlSsTQ3on+/GH4FlO586dufbaaznjjDOoVatW5OPk5OQwb948AObNm8fKlSuBYBiIgw46iHr16vHhhx/y7rvvlhtrly5dmDVrFitWrACCZ2ElA/aNHDmSNm3a8NRTT3HJJZckht3YsWNH4hnNk08+Sffu3Xc6ZsmPeJMmTdi8eXOFLfvK6tu3L6NHj04875k/fz4AJ5xwQmIojUWLFu10i660nj17Mm/ePB588MFEzWjTpk0ccMABNGzYkLVr1yYd0LCsylxHnz59GDNmTCJhbdiwIeUwIekUpQb1KHC+u1c8uIiI7DOys7MZO3Ysp59+Ok2aNKF79+4sWrQo6bYDBw7k3HPPTQzTHvU455xzDo899hj5+fl06tSJli2D1oennHIKY8aMITc3l1atWtGlS5dyY23atCnjxo1j8ODBbNu2DYA777wTgIceeog5c+ZQv359TjjhBO68805uv/12DjjgABYvXkzHjh1p2LBh4jZliUaNGjFs2DA6dOhATk4OnTp12q3y++1vf8t1111Hbm4u7k5OTg4vv/wyV1xxBUOHDiU3N5f8/Hw6d+6cdP9atWpxxhlnMG7cOMaPD25a5eXlccwxx9CuXTuOOuqoXcapSqYy13HppZeybNkycnNzqVOnDsOGDWP48OFMnDiRa665ho0bN1JcXMx1111Hu3bpG3CzwuE24kzDbaSXhttIHw23kXkHHnhgYoA9qRq7O9xGlFZ8IiIiVU4JSkRqJNWe4i/lMygzKyhvR3eft/fDERERCZTXSOL/wu9soBB4HzAgF5hN8PKuiFRSsqa8IvuqyrR3SHmLz91PdPcTgX8CBe5e6O4dgWOAFZWOUkTIzs5m/fr1lfpHK1LduDvr168nO3v3OiGK0sy8tbt/UOpEi8wsf3cDFJEfNW/enNWrVyft/01kX5SdnZ3yJelUoiSopWb2EPAXwIELCV7cFZFKqlOnDi1atMh0GCKxFiVBDQWuAK4N52cCD6QtIhEREaKNB7XVzMYAr7j7R1UQk4iISKS++PoBC4DXwvl8M3sx3YGJiEjNFuVF3RFAZ+BrAHdfAOSkMSYREZFICarY3TemPRIREZFSojSSWGRm5wO1zOxo4Brg7+kNS0REarooNairgXbANuApYBNw3Z6e2Mxqmdl8M3s5nG9hZrPNbLmZTTCz/fb0HCIiUn1FGfL9O3e/1d07hb1J3OruqYe2jO5adn6f6vfASHc/GvgK+OVeOIeIiFRTUVrxtTSzsWY2xczeKPnsyUnNrDlwOvBQOG8EI/aWDPU4HjhzT84hIiLVW5RnUM8CYwiSyd4aVfc+4D+A+uH8wcDX7l4czq8GDk+2o5ldBlwGcOSRR+6lcEREJG6iJKhid99rPUeY2RnAF+4+18x6lixOsmnSXjTdfSwwFoIRdfdWXCIiEi9REtRLZnYl8DxBQwkA3H1DJc/ZDehnZqcRDOXRgKBG1cjMaoe1qObAZ5U8voiI7AOitOK7GLiRoGn53PBTVNkTuvst7t7c3XOAQcAb7n4BMB0YUOqckyt7DhERqf6i9MVXVV0u3wQ8bWZ3AvOBh6vovCIiEkPlDfl+kru/YWZnJ1vv7s/t6cndfQYwI5z+mKBLJRERkXJrUD2AN4CfJ1nnwB4nKBERkVRSJih3HxF+D626cERERAJRWvFhZqcTdHeUGFDe3e9IV1AiIiJRepIYAwwk6JPPgHOBf0tzXCIiUsNFaWZ+nLv/AvjK3W8HugJHpDcsERGp6aIkqC3h93dmdhiwHaiqpuciIlJDRXkG9bKZNQL+AMwjaMH3UFqjEhGRGi/Ki7r/FU5OCsduytYIuyIikm7lvaib9AXdcN1eeVFXREQklfJqUMle0C2hF3VFRCStyntRVy/oiohIxkR5D+pgMxtlZvPMbK6Z/dHMDq6K4EREpOaK0sz8aWAdcA7BcBjrgAnpDEpERCRKM/PGpVryAdxpZmemKyARERGIVoOabmaDzCwr/JwH/DXdgYmISM0WJUFdDjxJMNz7NoJbfjeY2TdmtimdwYmISM0V5UXd+lURiIiISGlRWvH9ssx8LTMbkb6QREREot3i62Vmr5hZMzPrALwLqFYlIiJpFeUW3/lmNhD4APgOGOzus9IemYiI1GhRbvEdDVwLTAJWAReZWb00xyUiIjVclFt8LwG/dffLgR7AcuC9tEYlIiI1XpQXdTu7+yYAd3fg/8zsxfSGJSIiNV3KGpSZ/QeAu28ys3PLrFZHsiIiklbl3eIbVGr6ljLrTklDLCIiIgnlJShLMZ1sXkREZK8qL0F5iulk8yIiIntVeY0k8sK+9gyoW6rfPQOy0x6ZiIjUaOWNqFurKgMREREpLcp7UCIiIlVOCUpERGJJCUpERGIpSk8SIpU2cuqyTIcQW9f3bpnpEERiTTUoERGJJSUoERGJJSUoERGJpSpPUGZ2hJlNN7OlZrbYzK4Nlzc2s6lmtjz8PqiqYxMRkfjIRA2qGPi1u7cBugBXmVlb4GbgdXc/Gng9nBcRkRqqyhOUu69x93nh9DfAUuBwoD8wPtxsPHBmVccmIiLxkdFnUGaWAxwDzAYOdfc1ECQx4JAU+1xmZkVmVrRu3bqqClVERKpYxhKUmR0ITAKuKxmxNwp3H+vuhe5e2LRp0/QFKCIiGZWRBGVmdQiS0xPu/ly4eK2ZNQvXNwO+yERsIiISD5loxWfAw8BSd7+31KoXgYvD6YuByVUdm4iIxEcmujrqBlwEfGBmC8JlvwHuBp4xs18CnwDnZiA2ERGJiSpPUO7+NqmHjO9VlbGIiENwiFUAAApISURBVEh8qScJERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJJSUoERGJpdqZDkBE9szIqcsyHUJsXd+7ZaZDkD2gGpSIiMSSEpSIiMSSEpSIiMSSEpSIiMSSEpSIiMRSrBKUmZ1iZh+Z2QozuznT8YiISObEJkGZWS3gfuBUoC0w2MzaZjYqERHJlDi9B9UZWOHuHwOY2dNAf2BJRqMSkRpN75mllu73zMzd03qCqMxsAHCKu18azl8EHOvuw8tsdxlwWTjbCvionMM2Ab5MQ7jpUt3iheoXs+JNL8WbftUt5ori/Td3b5psRZxqUJZk2S7Z093HAmMjHdCsyN0L9zSwqlLd4oXqF7PiTS/Fm37VLeY9iTc2z6CA1cARpeabA59lKBYREcmwOCWo94CjzayFme0HDAJezHBMIiKSIbG5xefuxWY2HPgbUAt4xN0X7+FhI90KjJHqFi9Uv5gVb3op3vSrbjFXOt7YNJIQEREpLU63+ERERBKUoEREJJb2qQRlZo3NbKqZLQ+/D0qx3Q9mtiD8VHlDjIq6dDKz/c1sQrh+tpnlVHWMZeKpKN4hZrauVJlemok4S8XziJl9YWaLUqw3MxsVXs9CMyuo6hjLxFNRvD3NbGOp8v1dVcdYJp4jzGy6mS01s8Vmdm2SbWJTxhHjjVsZZ5vZHDN7P4z59iTbxOZ3ImK8u/874e77zAf4X+DmcPpm4PcpttucwRhrAf8AjgL2A94H2pbZ5kpgTDg9CJgQ83iHAH/K9J9/qXhOAAqARSnWnwa8SvDuXRdgdszj7Qm8nOlyLRVPM6AgnK4PLEvydyI2ZRwx3riVsQEHhtN1gNlAlzLbxOl3Ikq8u/07sU/VoAi6RhofTo8HzsxgLKkkunRy9++Bki6dSit9HROBXmaW7EXmqhAl3lhx95nAhnI26Q885oF3gUZm1qxqottVhHhjxd3XuPu8cPobYClweJnNYlPGEeONlbDcNoezdcJP2RZtsfmdiBjvbtvXEtSh7r4Ggr+UwCEptss2syIze9fMqjqJHQ78q9T8anb9x5LYxt2LgY3AwVUS3a6ixAtwTngrZ6KZHZFkfZxEvaY46RrePnnVzNplOpgS4W2lYwj+x1xaLMu4nHghZmVsZrXMbAHwBTDV3VOWcQx+J6LEC7v5O1HtEpSZTTOzRUk+u/O/+iM96HrjfOA+M/tpmsJNJkqXTpG6faoiUWJ5Cchx91xgGj/+ry6u4lS+Ucwj6K8sDxgNvJDheAAwswOBScB17r6p7Ooku2S0jCuIN3Zl7O4/uHs+Qa86nc2sfZlNYlXGEeLd7d+Japeg3P1kd2+f5DMZWFtyGyH8/iLFMT4Lvz8GZhD8j6qqROnSKbGNmdUGGpK5W0AVxuvu6919Wzj7INCximKrrGrVrZa7byq5feLurwB1zKxJJmMyszoEP/ZPuPtzSTaJVRlXFG8cy7iEu39N8Dt1SplVcfqdSEgVb2V+J6pdgqrAi8DF4fTFwOSyG5jZQWa2fzjdBOhG1Q7pEaVLp9LXMQB4w8OnjBlQYbxlni30I7jHH2cvAr8IW5p1ATaW3BqOIzP7ScmzBTPrTPDvdn0G4zHgYWCpu9+bYrPYlHGUeGNYxk3NrFE4XRc4GfiwzGax+Z2IEm+lficy1eojHR+C+6+vA8vD78bh8kLgoXD6OOADgtZoHwC/zECcpxG0JPoHcGu47A6gXzidDTwLrADmAEdluFwrivd/gMVhmU4HWmc43qeANcB2gv9l/hL4FfCrcL0RDI75j/DvQGHM4x1eqnzfBY7LcLzdCW4lLQQWhJ/T4lrGEeONWxnnAvPDmBcBvwuXx/J3ImK8u/07oa6OREQklva1W3wiIrKPUIISEZFYUoISEZFYUoISEZFYUoISEZFYUoKSfYb92Ev9IjN71szqpdjulZJ3Nnbz+IeZ2cQ9iG9VXF7+TKew1+rDMh2HVH9KULIv2eLu+e7eHvie4D2XhPCl0Sx3P82Dt913i7t/5u4D9law+7AhgBKU7DElKNlXvQX8zMxyLBgH6P8R9Ld2RElNptS6B8MxbKaEb8FjZj8L+31838zmmdlPw+0XheuHmNlkM3vNgrGyRpSc2MxeMLO54TEvqyhQC8bbmhee6/VwWePwOAst6NQ4N1x+m5mND2NdZWZnm9n/mtkHYSx1wu1WmdnvLRijZ46Z/Sxc/m9m9np43NfN7Mhw+TgLxm/6u5l9bGYDSsV3o5m9F+5ze7gsadmF+xUCT4S12bpmdreZLQn3v2cv/NlKTZHJt6X10WdvfgjH+QJqE3RzdQWQA+yg1Ng0wCqgSbiuGMgPlz8DXBhOzwbOCqezgXrh9ovCZUMIen84GKhL8PZ8YbiupAeTkuUHlz5vmZibEvRI3aLMvqOBEeH0ScCCcPo24G2C4QzygO+AU8N1zwNnljpXSa8fvyAc64igw86Lw+lLgBfC6XEEvRJkAW0JhlgB6AOMJegZIgt4mWD8qvLKbkbpsgA+gkSnAI0y/fdEn+rzUQ1K9iV1Lejuvwj4hKD/NYB/ejAmUTIr3X1BOD0XyDGz+sDh7v48gLtvdffvkuw71YMOMLcAzxF0qQNwjZmVdJlzBHB0OTF3AWa6+8rwXCWdfXYHHg+XvQEcbGYNw3Wvuvt2gi6EagGvhcs/IEgcJZ4q9d01nO4KPBlOP14qZgiS1Q53XwIcGi7rE37mE9RAW5e6nl3KLsn1bQK2Ag+Z2dkECVUkktqZDkBkL9riQXf/CWH/n9+Ws8+2UtM/ENR6og76VrafMDezngQdZXZ19+/MbAZBDSwVS3KckuWpzrcNwN13mNl2dy9ZvoOd/017iulkx0wct8z5Dfgfd//zTsEF4yolK7udD+5eHHa+2ougo+HhBDVCkQqpBiVShgdjBa22cDBLM9s/RYvA3uGzoroEozfPIhjy4KswObUmqCGV5x2gh5m1CM/VOFw+E7ggXNYT+NJ3HcOoIgNLfb8TTv+dIFEQHv/tCo7xN+ASC8ZSwswON7NUA4GW+IZgaPWSMZgaejCExXVAfnk7ipSmGpRIchcBfzazOwh6GT+XoIZS2tsEt8l+Bjzp7kVm9gHwKzNbSPDsJdWtRQDcfV3YkOI5M8siGMOsN8GzpkfD43zHj8Mq7I79zWw2wX9EB4fLrgEeMbMbgXXA0Arim2JmbYB3wtroZuBCghpTKuOAMWa2BTgVmGxm2QS1sesrcR1SQ6k3c5FKMLMhBA0Bhmc6lmTMbBVBfF9mOhaRytItPhERiSXVoEREJJZUgxIRkVhSghIRkVhSghIRkVhSghIRkVhSghIRkVj6/8HMsRbSTIY0AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "plt.figure(figsize=(6, 4))\n",
    "\n",
    "plt.bar(range(4), var_exp, alpha=0.5, align='center',\n",
    "            label='individual explained variance')\n",
    "plt.step(range(4), cum_var_exp, where='mid',\n",
    "             label='cumulative explained variance')\n",
    "plt.ylabel('Explained variance ratio')\n",
    "plt.xlabel('Principal components')\n",
    "plt.legend(loc='best')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Matrix W:\n",
      " [[ 0.52308496 -0.36956962]\n",
      " [-0.25956935 -0.92681168]\n",
      " [ 0.58184289 -0.01912775]\n",
      " [ 0.56609604 -0.06381646]]\n"
     ]
    }
   ],
   "source": [
    "matrix_w = np.hstack((eig_pairs[0][1].reshape(4,1),\n",
    "                      eig_pairs[1][1].reshape(4,1)))\n",
    "\n",
    "print('Matrix W:\\n', matrix_w)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-2.10795032,  0.64427554],\n",
       "       [-2.38797131,  0.30583307],\n",
       "       [-2.32487909,  0.56292316],\n",
       "       [-2.40508635, -0.687591  ],\n",
       "       [-2.08320351, -1.53025171],\n",
       "       [-2.4636848 , -0.08795413],\n",
       "       [-2.25174963, -0.25964365],\n",
       "       [-2.3645813 ,  1.08255676],\n",
       "       [-2.20946338,  0.43707676],\n",
       "       [-2.17862017, -1.08221046],\n",
       "       [-2.34525657, -0.17122946],\n",
       "       [-2.24590315,  0.6974389 ],\n",
       "       [-2.66214582,  0.92447316],\n",
       "       [-2.2050227 , -1.90150522],\n",
       "       [-2.25993023, -2.73492274],\n",
       "       [-2.21591283, -1.52588897],\n",
       "       [-2.20705382, -0.52623535],\n",
       "       [-1.9077081 , -1.4415791 ],\n",
       "       [-2.35411558, -1.17088308],\n",
       "       [-1.93202643, -0.44083479],\n",
       "       [-2.21942518, -0.96477499],\n",
       "       [-2.79116421, -0.50421849],\n",
       "       [-1.83814105, -0.11729122],\n",
       "       [-2.24572458, -0.17450151],\n",
       "       [-1.97825353,  0.59734172],\n",
       "       [-2.06935091, -0.27755619],\n",
       "       [-2.18514506, -0.56366755],\n",
       "       [-2.15824269, -0.34805785],\n",
       "       [-2.28843932,  0.30256102],\n",
       "       [-2.16501749,  0.47232759],\n",
       "       [-1.8491597 , -0.45547527],\n",
       "       [-2.62023392, -1.84237072],\n",
       "       [-2.44885384, -2.1984673 ],\n",
       "       [-2.20946338,  0.43707676],\n",
       "       [-2.23112223,  0.17266644],\n",
       "       [-2.06147331, -0.6957435 ],\n",
       "       [-2.20946338,  0.43707676],\n",
       "       [-2.45783833,  0.86912843],\n",
       "       [-2.1884075 , -0.30439609],\n",
       "       [-2.30357329, -0.48039222],\n",
       "       [-1.89932763,  2.31759817],\n",
       "       [-2.57799771,  0.4400904 ],\n",
       "       [-1.98020921, -0.50889705],\n",
       "       [-2.14679556, -1.18365675],\n",
       "       [-2.09668176,  0.68061705],\n",
       "       [-2.39554894, -1.16356284],\n",
       "       [-2.41813611,  0.34949483],\n",
       "       [-2.24196231, -1.03745802],\n",
       "       [-2.22484727, -0.04403395],\n",
       "       [ 1.09225538, -0.86148748],\n",
       "       [ 0.72045861, -0.59920238],\n",
       "       [ 1.2299583 , -0.61280832],\n",
       "       [ 0.37598859,  1.756516  ],\n",
       "       [ 1.05729685,  0.21303055],\n",
       "       [ 0.36816104,  0.58896262],\n",
       "       [ 0.73800214, -0.77956125],\n",
       "       [-0.52021731,  1.84337921],\n",
       "       [ 0.9113379 , -0.02941906],\n",
       "       [-0.01292322,  1.02537703],\n",
       "       [-0.15020174,  2.65452146],\n",
       "       [ 0.42437533,  0.05686991],\n",
       "       [ 0.52894687,  1.77250558],\n",
       "       [ 0.70241525,  0.18484154],\n",
       "       [-0.05385675,  0.42901221],\n",
       "       [ 0.86277668, -0.50943908],\n",
       "       [ 0.33388091,  0.18785518],\n",
       "       [ 0.13504146,  0.7883247 ],\n",
       "       [ 1.19457128,  1.63549265],\n",
       "       [ 0.13677262,  1.30063807],\n",
       "       [ 0.72711201, -0.40394501],\n",
       "       [ 0.45564294,  0.41540628],\n",
       "       [ 1.21038365,  0.94282042],\n",
       "       [ 0.61327355,  0.4161824 ],\n",
       "       [ 0.68512164,  0.06335788],\n",
       "       [ 0.85951424, -0.25016762],\n",
       "       [ 1.23906722,  0.08500278],\n",
       "       [ 1.34575245, -0.32669695],\n",
       "       [ 0.64732915,  0.22336443],\n",
       "       [-0.06728496,  1.05414028],\n",
       "       [ 0.10033285,  1.56100021],\n",
       "       [-0.00745518,  1.57050182],\n",
       "       [ 0.2179082 ,  0.77368423],\n",
       "       [ 1.04116321,  0.63744742],\n",
       "       [ 0.20719664,  0.27736006],\n",
       "       [ 0.42154138, -0.85764157],\n",
       "       [ 1.03691937, -0.52112206],\n",
       "       [ 1.015435  ,  1.39413373],\n",
       "       [ 0.0519502 ,  0.20903977],\n",
       "       [ 0.25582921,  1.32747797],\n",
       "       [ 0.25384813,  1.11700714],\n",
       "       [ 0.60915822, -0.02858679],\n",
       "       [ 0.31116522,  0.98711256],\n",
       "       [-0.39679548,  2.01314578],\n",
       "       [ 0.26536661,  0.85150613],\n",
       "       [ 0.07385897,  0.17160757],\n",
       "       [ 0.20854936,  0.37771566],\n",
       "       [ 0.55843737,  0.15286277],\n",
       "       [-0.47853403,  1.53421644],\n",
       "       [ 0.23545172,  0.59332536],\n",
       "       [ 1.8408037 , -0.86943848],\n",
       "       [ 1.13831104,  0.70171953],\n",
       "       [ 2.19615974, -0.54916658],\n",
       "       [ 1.42613827,  0.05187679],\n",
       "       [ 1.8575403 , -0.28797217],\n",
       "       [ 2.74511173, -0.78056359],\n",
       "       [ 0.34010583,  1.5568955 ],\n",
       "       [ 2.29180093, -0.40328242],\n",
       "       [ 1.98618025,  0.72876171],\n",
       "       [ 2.26382116, -1.91685818],\n",
       "       [ 1.35591821, -0.69255356],\n",
       "       [ 1.58471851,  0.43102351],\n",
       "       [ 1.87342402, -0.41054652],\n",
       "       [ 1.23656166,  1.16818977],\n",
       "       [ 1.45128483,  0.4451459 ],\n",
       "       [ 1.58276283, -0.67521526],\n",
       "       [ 1.45956552, -0.25105642],\n",
       "       [ 2.43560434, -2.55096977],\n",
       "       [ 3.29752602,  0.01266612],\n",
       "       [ 1.23377366,  1.71954411],\n",
       "       [ 2.03218282, -0.90334021],\n",
       "       [ 0.95980311,  0.57047585],\n",
       "       [ 2.88717988, -0.38895776],\n",
       "       [ 1.31405636,  0.48854962],\n",
       "       [ 1.69619746, -1.01153249],\n",
       "       [ 1.94868773, -0.99881497],\n",
       "       [ 1.1574572 ,  0.31987373],\n",
       "       [ 1.007133  , -0.06550254],\n",
       "       [ 1.7733922 ,  0.19641059],\n",
       "       [ 1.85327106, -0.55077372],\n",
       "       [ 2.4234788 , -0.2397454 ],\n",
       "       [ 2.31353522, -2.62038074],\n",
       "       [ 1.84800289,  0.18799967],\n",
       "       [ 1.09649923,  0.29708201],\n",
       "       [ 1.1812503 ,  0.81858241],\n",
       "       [ 2.79178861, -0.83668445],\n",
       "       [ 1.57340399, -1.07118383],\n",
       "       [ 1.33614369, -0.420823  ],\n",
       "       [ 0.91061354, -0.01965942],\n",
       "       [ 1.84350913, -0.66872729],\n",
       "       [ 2.00701161, -0.60663655],\n",
       "       [ 1.89319854, -0.68227708],\n",
       "       [ 1.13831104,  0.70171953],\n",
       "       [ 2.03519535, -0.86076914],\n",
       "       [ 1.99464025, -1.04517619],\n",
       "       [ 1.85977129, -0.37934387],\n",
       "       [ 1.54200377,  0.90808604],\n",
       "       [ 1.50925493, -0.26460621],\n",
       "       [ 1.3690965 , -1.01583909],\n",
       "       [ 0.94680339,  0.02182097]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Y = X_std.dot(matrix_w)\n",
    "Y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3de3xcdbX38c/qpMcSCgWhHqGFBF7iBXpvKVehmCrI9YVyOwQOVSGeRA4oB8TSh1L6WBThAN4anyiHW+MRLKJFFLGFCijCSUulFEQRSS3wPIQCxVKKbbqeP/YkTSYz6Z5kz569J9/36zWvZH6zZ8/Kr5OuzN6/tZe5OyIiIkkzrNwBiIiI5KMEJSIiiaQEJSIiiaQEJSIiiaQEJSIiiaQEJSIiiVQVx4uYWQZoA15y9xNzHpsFXAe8lB36jrv/oL/97bnnnl5bW1uCSEVEJG4rVqx4zd1H547HkqCAi4FngV0LPH6nu18Ydme1tbW0tbVFEpiIiJSXmbXnGy/5IT4zGwucAPT7qUhERKSnOM5B3QR8GdjWzzafNrOnzGyxme0TQ0wiIpJwJU1QZnYi8Kq7r+hns3uBWnefACwFbiuwrwYzazOzto6OjhJEKyIiSWKlvBafmX0NOBfYCowgOAf1E3c/p8D2GeB1dx/V336nTZvmOgclIvls2bKFdevWsXnz5nKHIjlGjBjB2LFjGT58eK9xM1vh7tNyty/pIgl3nw3MzgYwA7g0NzmZ2V7u/kr27skEiylERAZk3bp17LLLLtTW1mJm5Q5Hstyd9evXs27dOvbbb79QzylLHZSZzTezk7N3LzKzNWb2B+AiYFY5YhKRyrB582b22GMPJaeEMTP22GOPoj7ZxrXMHHdfDizPfj+3x3j3pywRkSgoOSVTsf8uupKEDFmtrVBbC8OGBV9bW8sdkYj0pAQlQ1JrKzQ0QHs7uAdfGxqUpCQaI0eOLPjY4YcfXrLXveaaa0q273JQgpIhac4c2LSp99imTcG4SCl0dnYC8Lvf/a5kr6EEJVIB1q4tblwqVykP9S5fvpxjjjmGs88+m/HjxwPbP1298sorHHXUUUyaNIlx48bxyCOP9Hn+mjVrmD59OpMmTWLChAn8+c9/BmDRokXd45///Ofp7OzkK1/5Cu+88w6TJk2ivr4egBtuuIFx48Yxbtw4brrpJgDefvttTjjhBCZOnMi4ceO48847AZg/fz4HH3ww48aNo6GhgVKWIIXm7qm7TZ061UUGo6bGPTi41/tWU1PuyGSwnnnmmdDbLlrkXl3d+z1QXR2MD8bOO+/s7u4PPfSQV1dX+wsvvNDnseuvv96/+tWvurv71q1b/a233uqznwsvvNAXZYN59913fdOmTf7MM8/4iSee6P/4xz/c3b2xsdFvu+22Xvt2d29ra/Nx48b5xo0b/e9//7sfeOCBvnLlSl+8eLGff/753du9+eab7u6+fv367rFzzjnHlyxZMrhJKCDfvw/Q5nn+r9cnKBmSFiyA6ureY9XVwbgMHXEc6p0+fXreup+DDz6YW265hXnz5rF69Wp22WWXPtscdthhXHPNNVx77bW0t7ez0047sWzZMlasWMHBBx/MpEmTWLZsGS+88EKf5z766KOceuqp7LzzzowcOZJPfepTPPLII4wfP56lS5dy+eWX88gjjzBqVHBdhIceeohDDjmE8ePH8+CDD7JmzZroJmGAlKBkSKqvh5YWqKkBs+BrS0swLkNHHId6d95557zjRx11FA8//DBjxozh3HPP5fbbb+eee+5h0qRJTJo0iba2Ns4++2yWLFnCTjvtxLHHHsuDDz6Iu3PeeeexatUqVq1axXPPPce8efP67N8LHKL74Ac/yIoVKxg/fjyzZ89m/vz5bN68maamJhYvXszq1au54IILEnElDiUoGbLq6+HFF2HbtuCrktPQs+++xY1Hqb29nfe9731ccMEFfO5zn2PlypWceuqp3Yln2rRpvPDCC+y///5cdNFFnHzyyTz11FPU1dWxePFiXn31VQBef/112tuDbhXDhw9ny5YtQJAAf/rTn7Jp0ybefvtt7rnnHj760Y/y8ssvU11dzTnnnMOll17KypUru5PRnnvuycaNG1m8eHHpJyCE2Ap1RUSSZsGCoLyg52G+uA71Ll++nOuuu47hw4czcuRIbr/99j7b3HnnnSxatIjhw4fz/ve/n7lz5/Le976Xr371q3ziE59g27ZtDB8+nO9+97vU1NTQ0NDAhAkTmDJlCq2trcyaNYvp06cDcP755zN58mR+9atfcdlllzFs2DCGDx9Oc3Mzu+22GxdccAHjx4+ntraWgw8+uPQTEEJJLxZbKrpYrIgU8uyzz/KRj3wk9PatrcE5p7Vr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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(6, 4))\n",
    "for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'),\n",
    "                        ('blue', 'red', 'green')):\n",
    "     plt.scatter(X[y==lab, 0],\n",
    "                X[y==lab, 1],\n",
    "                label=lab,\n",
    "                c=col)\n",
    "plt.xlabel('sepal_len')\n",
    "plt.ylabel('sepal_wid')\n",
    "plt.legend(loc='best')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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9/H1r3+94J/z89iXXHIJ69evL2ZYJkN6ptQ30IeigzOlvoE+1/tvHLBWCF4sQJmqVanzAUG22zjrrLO46qqrhl2fr72Fn8f+wQ9+wMSJE4sem3F4zZRqpdb1/o2jrRWCFwtQpip5fcoNKkiVq93G0qVLufzyywG4+OKL+cIXvsDJJ5/MlVdeyZYtWzjllFM48sgj+exnP0tTU9Nga430Y69atYqTTjqJc889l8MPP5z29vbBskknnXQS6Y3wv/zlLznyyCM54ogjaGtrA+CZZ57h+OOPZ8qUKRx//PG8+OKLgfxfJY3XjGi37qa+bmh5rfq6errayl9eK64sQJmqVInzAc888wxdXV3Dls1+9KMfcdppp7FmzRqee+45Wltbh/3sBRdcwJ133gk4AW3z5s0cddRRw+73pz/9iUceeYRvfetbXHfddXz84x8frO3n1ssJnPp9ixcvZv369bz00kv85je/GXL7li1buPTSS7n77rt57rnnBquqH3744Tz++OP84Q9/4Prrr+crX/lKUf8vSec1I2oa3cSSM5fQNLoJQQa/twQJbxagyqxCTVtNgbw+5QZ5PqAc7TayzZo1i9paZ+noySefHKx6fvrpp/Oe97zHc1zjx4+npqaG1tZWNmzYMOT2p59+mhNPPHFw7OlWHAMDA8yaNYtJkybx+c9/fsgMz+zV1dblOVNqb2lnwxUb2LNwDxuu2GDBKQ8LUGVU5qatpgRen3KDPB9QjnYbuR7Db13N/fbbb/Dr2traYeevvFpxXHPNNZx88sk8//zz3H///ezYscPX41Wb9pZ2mykFxAJUGXV2wvahq0hs3+5cb8KV61NuuZXSbiOXE044YXBZ8OGHHx5sxV6o4447jl//+tf87W9/A/a24hgYGGDcuHGA02LeeLOZUjAsQJVRBZq2miKF+Sl31apVtLa2MmXKFO6++24WLFjger9zzz2XH//4x5x33nm+jrtw4UIefvhhjjzySB588EEOPfRQ1+XDfMaOHcuSJUs455xzOOKIIwa75H75y1/m6quv5qMf/ehgZqIx5WTtNsqoudlZ1svW1OR04jXBqvaWDu+88w61tbXss88+PPXUU8ybN481a9aEPSzAfjcmN692G1bqqIy6upxzTpnLfBVq2mqq0MaNGznvvPPYs2cP++67L9///vfDHpIxJbEAVUYhNm01VWjC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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(6, 4))\n",
    "for lab, col in zip(('Iris-setosa', 'Iris-versicolor', 'Iris-virginica'),\n",
    "                        ('blue', 'red', 'green')):\n",
    "     plt.scatter(Y[y==lab, 0],\n",
    "                Y[y==lab, 1],\n",
    "                label=lab,\n",
    "                c=col)\n",
    "plt.xlabel('Principal Component 1')\n",
    "plt.ylabel('Principal Component 2')\n",
    "plt.legend(loc='lower center')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
